/**
 * 外部中断0低电平触发，
 * 每按下一次S2按键就会中断一次，
 * LED灯会发生状态变化
 *
 * 使用说明
 * 用1根杜邦线把P32和P37相接，
 * 每按下一次S2按键就会中断一次。
 */
#include <STC/STC89C5xRC.H>

#define uchar unsigned char
#define uint unsigned int

sbit key_s2 = P3 ^ 0; // 独立按键S2
sbit flag = P3 ^ 7;	  // 产生外部中断信号的引脚

/**
 * 毫秒级延时
 * 12T
 * Fosc = 11.0592 MHz
 * @param ms 延时毫秒数，设定的取值范围：0~65535
 */
void delay(uint ms)
{
	uint x, y;
	for (x = ms; x > 0; x--)
		for (y = 114; y > 0; y--)
			;
}

/**
 * 初始化外部中断0
 */
void int0_init()
{
	EA = 1;	 // 中断使能
	IT0 = 0; // 外部中断0低电平触发
	EX0 = 1; // 外部中断0使能
}

void main()
{
	int0_init();
	while (1)
	{
		if (key_s2 == 0) // 判断S2是否被按下
		{
			delay(20); // 按键消抖
			if (key_s2 == 0)
			{
				flag = 0;
				flag = 0; // 产生低电平，CPU会采样2次P3.2的状态,两次都为低才触发
				flag = 1; // 结束低电平
				while (!key_s2)
					; // 松手检测
			}
		}
	}
}

/**
 * 外部中断0服务
 */
void int0() interrupt 0
{
	P1 = ~P1; // 按位取反P1
}
